package com.gopay.common.cps.dao.order;

import com.gopay.common.base.dao.BaseReadDAO;
import com.gopay.common.domain.cps.CpsGenMainOrder;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 主订单查询DAO
 * 
 * @CpsGeneralMainOrderQueryDAO.java
 * @author MA HUAN
 * @2013-1-9 上午10:52:55 www.gopay.com.cn Inc.All rights reserved.
 */

public interface CpsGeneralMainOrderQueryDAO extends BaseReadDAO<CpsGenMainOrder, Serializable> {
	public CpsGenMainOrder findByRelevanceGopayOrderIdAndGopayIntTxnCd(String relevanceGopayOutOrderId , String gopayIntTxnCd);

    CpsGenMainOrder getSuccessPayOrder(String orderId, String merId, String merOrderId);

    List<CpsGenMainOrder> getSuccessPayOrders(String orderId, String merId, String merOrderId);

    /**
     * 获取相同商户Id和相同商户订单号的订单列表
     * 
     * @param merId
     * @param merOrder
     * @return
     */
    public List<CpsGenMainOrder> findCpsGenMainOrderByMerIdAndMerOrder(String merId, String merOrder);

    CpsGenMainOrder findByGopayOrderId(String gopayOrderId);

    CpsGenMainOrder findByRelevanceGopayOrderId(String relevanceGopayOutOrderId);
    public CpsGenMainOrder findByRelevanceGopayOrderId01609(String relevanceGopayOutOrderId) ;
    /**
     * 云账户冻结 解冻查询关联订单号
     * @param relevanceGopayOutOrderId
     * @return
     */
    public List<CpsGenMainOrder> findByRelevanceGopayOrderIds(String relevanceGopayOutOrderId);

    public List<CpsGenMainOrder> findByRelOrderId(String relOrderId);

    /**
     * 获取累计待审核退款金额
     * 
     * @param gopayOrderId
     * @return
     */
    public BigDecimal findTotal01RefundAmt(String gopayOrderId);

    /**
     * 获取累计待审核退还手续费金额
     * 
     * @param gopayOrderId
     * @return
     */
    public BigDecimal findTotal01RefundFeeAmt(String gopayOrderId);

    /**
     * 定时任务-超时订单清理 根据超时时间获取除银行订单以外的超时订单
     * 
     * @param timeSpan
     * @return
     */
    public List<Object> findTimeoutCpsGenMainOrderByTimeSpan(int timeSpan);

    /**
     * 定时任务-手工调账超时订单清理
     * 
     * @return
     */
    public List<Object> findTimeoutManualAdjust(int pageNo,int pageSize);
    
    public int findTimeoutManualAdjustCount();
    /**
     * 获取订单列表
     * 
     * @param txnStaCd
     *            订单状态
     * @param pageIndex
     *            当期页数
     * @param pageSize
     *            每页记录数
     * @return
     */
    public List<CpsGenMainOrder> getMainOrders(int txnStaCd, int pageIndex, int pageSize);

    /**
     * 获取订单列表
     * @param txnStaCd 订单状态
     * @param gopayIntTxnCd  交易类型
     * @return
     */
    public List<CpsGenMainOrder> getMainOrders(int txnStaCd, String gopayIntTxnCd);

    /**
     * 获取订单总数
     * 
     * @param txnStaCd
     *            订单状态
     * @return
     */
    public int getMainOrderCount(int txnStaCd);
    
    public List<Object> findTimeoutOrdersInPay(Map param,int pageNo,int pageSize);
    
    public List<Object> findTimeoutOrdersInRecharge(Map param,int pageNo,int pageSize);
    
    public int findTimeoutOrdersInRechargeCount(Map param);
    
    public int findTimeoutOrdersInOfflineRechargeCount(Map param);
    
    public List<Object> findTimeoutOrdersInOfflineRecharge(Map param,int pageNo,int pageSize);
    public int findTimeoutOrdersInMoneyInCount(Map param);
    
    public List<Object> findTimeoutOrdersInMoneyIn(Map param,int pageNo,int pageSize);
    public int findTimeoutOrdersInGuaranteePaymentApplyCount(Map param);
    
    public List<Object> findTimeoutOrdersInGuaranteePaymentApply(Map param,int pageNo,int pageSize);
    public int findTimeoutOrdersInPayCount(Map param);

    public List<?> findSuOrdersWithOutInAcct(int pageIndex,int pageSize,Date date);
    
    public int findSuOrdersWithOutInAcctCount(Date date);

    public int findTimeoutOrdersCount(Map param);
    public List<Object> findTimeoutOrders(Map param,int pageNo,int pageSize);
    
    
    public  List<CpsGenMainOrder> findCpsGenMainOrders(String payAcct,String gopayTxnCt,int pageIndex, int pageSize);
    public  int cpsGenMainOrderCount(String payAcct,String gopayTxnCt);
    
//    /**
//     * 查找订单根据订单创建时间，订单处理码  
//     * @return
//     */
//    public List<CpsGenMainOrder> findTimeoutOrdersByCreateTimeAndProcessCode(String procCode);
    /**
     * 根据relevanceGopayOutOrderId和intTxnCd查询订单信息
     * @param relevanceGopayOutOrderId
     * @param intTxnCd
     * @return
     */
    public CpsGenMainOrder findByRelevanceAndTxnCd(String relevanceGopayOutOrderId,String intTxnCd);
    
    /**
     * 做交易得红包活动专用
	 * 根据国付宝交易类型查询未参加过相应活动的订单
	 * 
	 * @param intTxnCdList
	 * @return
	 */
    public List<CpsGenMainOrder> findByWaPromotionsLog(List<String> intTxnCdList,Map<String,String> paramMap);

    
    /**
     * 根据交易类型及、收款账户或付款账户、状态（可以多个）查询大于创建时间的订单数量
     * @param gopayIntTxnCd 交易类型
     * @param custId 收款账户或付款账户
     * @param custIdType 账户类型 pay：付款账户，recv：收款账户,其他字符串sql无custId查询条件
     * @param txnStaCds 订单状态
     * @param txnStaCdsEqualFlag 订单状态标识 true：等于，false：不等于
     * @param createdTs 创建时间
     * @return 订单数量
     */
	public int findCountByIntTxnCdAndCustIdAndTxnStaCd(String gopayIntTxnCd, String custId, String custIdType,
			int[] txnStaCds, boolean txnStaCdsEqualFlag, String createdTs ) ;
    
	/**
     * 根据交易类型及、收款账户或付款账户、状态（可以多个）查询大于创建时间的订单数量
     * @param gopayIntTxnCd 交易类型
     * @param mainRecvCustId 收款账户
     * @param txnStaCds 订单状态
     * @param txnStaCdsEqualFlag 订单状态标识 true：等于，false：不等于
     * @param createdTs 创建时间
     * @return 订单数量、商户交易总金额
     * @author tangyang
     * @date 20160911
     * @使用范围：手机钱包账户余额充值，校验当日交易次数限制
     */
	public int findCountByIntTxnCdAndCustIdAndTxnStaCd(String gopayIntTxnCd, String mainRecvCustId,
			int[] txnStaCds, boolean txnStaCdsEqualFlag, String createdTs );
	
	public Map findCountAndTotalAmt(String gopayIntTxnCd, String custId, String custIdType,
			int[] txnStaCds, boolean txnStaCdsEqualFlag, String createdTs );

	public Map findCountAndTotalAmt(String gopayIntTxnCd, String custId, String custIdType,
            int[] txnStaCds, boolean txnStaCdsEqualFlag,String bankCardName ,boolean bankCardNameFalg, String createdTs ) ;

     /**
      * 跨境人民币的01720,01723,01724的超时订单没有支付，置为失效 add by qld
      */
    public List<Object> findTimeoutOrdersInCBPay(Map param,int pageNo,int pageSize);

//	/**
//	 * 查询天溢赢超时订单
//	 * @param txnStaCd
//	 * @return
//	 */
//	public List<CpsGenMainOrder> findTimeoutTyyOrdersByCreateTimeAndProcessCode(String txnStaCd);
//	/**
//	 * 查询天溢赢银行回应超时订单
//	 * @param txnStaCd
//	 * @return
//	 */
//	public List<CpsGenMainOrder> findBankTimeoutTyyOrdersByCreateTimeAndProcessCode(List<Integer> txnStaCodeList);

    /**
     * 根据原订单号查询是否发生过因为“银行卡异常”的正常退款失败或者因为“请核对账户信息”的退款转账失败
     * @param orderId 原订单号
     * @return 结果记录个数
     */
    public boolean findRefundExistByRelevanceId(String orderId);

    /**
     * 获取指定交易类型、客户id、交易状态的交易个数（判断该商户是否成功发生过指定交易）
     * @return
     */
    public boolean findExistByIntTxnCdCustId(String tranType,String custId);
    
    /**
     * 根据交易类型和状态查询制定日期订单集
     * @param txnStaCd
     * @param gopayIntTxnCd
     * @param tranFinishTime
     * @return
     */
    public List<CpsGenMainOrder> findOrderByIntTxnCdAndTxnStaCd(int txnStaCd, String gopayIntTxnCd, Date tranFinishTime) ;


    public List<CpsGenMainOrder> findListByRelevanceGopayOrderIdAndGopayIntTxnCd(String relevanceGopayOrderId, String gopayIntTxnCd);
//    /**
//     * 根据订单号array[]查询主订单数据
//     * @param array
//     * @return
//     */
//	public List<CpsGenMainOrder> findTimeoutBounsOrdersByCreateTime(String gopayOrderId);

    List<CpsGenMainOrder> findOrdersByRelevanceGopayOrderIdAndGopayIntTxnCd(String relevanceGopayOrderId,String gopayIntTxnCd);

    List<Object> findTimeoutOrdersInOrder01813(Map param, int pageNo, int pageSize);

    /**
     * 通用分账检查是否已生成过分账子订单
     * @return
     */
    boolean findSpiltOrder(String relevanceGopayOrderId,String mainRecvAcct);

    List<CpsGenMainOrder> findListByRelevanceGopayOrderIdAndGopayIntTxnCdRecvAcct(String relevanceGopayOrderId, String gopayIntTxnCd, String recvAcct);

    /**
     * 基金订单数量查询 add by jianghoupeng 20171219
     * @param param
     * @return
     */
    int findTimeoutOrdersInFundCount(Map param);

    /**
     * 基金订单查询 add by jianghoupeng 20171219
     * @param param
     * @param pageNo
     * @param pageSize
     * @return
     */
    List<Object> findTimeoutOrdersInFund(Map param, int pageNo,int pageSize);
}
